package pre_processamento;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;

public class Dados {

	private List<LinkedList<Double>> dados = new LinkedList<LinkedList<Double>>();;
	private List<Integer> respostas = new LinkedList<Integer>();;

	public Dados(String caminho) throws Exception {

		BufferedReader buffer = obtemBufferedReader(caminho);
		carregaDados(buffer);
		carregaRespostas();
	}

	private BufferedReader obtemBufferedReader(String caminho) throws Exception {

		File arquivo = new File(caminho);
		FileReader leitor = new FileReader(arquivo);
		BufferedReader buffer = new BufferedReader(leitor);
		
		return buffer;
	}

	private void carregaDados(BufferedReader buffer) throws IOException {
		
		String linha = "";
		
		while ((linha = buffer.readLine()) != null) {
			
			LinkedList<Double> valoresLinha = converteLinha(linha);
			dados.add(valoresLinha);
			
		}

	}

	private LinkedList<Double> converteLinha(String linha) {

		LinkedList<Double> valoresLinha = new LinkedList<Double>();

		StringTokenizer tokens = new StringTokenizer(linha, ";");

		while (tokens.hasMoreTokens()) {

			String valorString = tokens.nextToken();
			double valor = Double.parseDouble(valorString);
			valoresLinha.add(valor);
		}

		return valoresLinha;
	}

	private void carregaRespostas() {

		for (int i = 0; i < 50; i++) {
			Collections.shuffle(dados);
		}

		for (LinkedList<Double> listaAtributos : dados) {

			Double ultimo = listaAtributos.removeLast();
			respostas.add(ultimo.intValue());
		}
	}

	public double[] obtemCoordenadas(int i) {

		LinkedList<Double> listaDados = dados.get(i);
		Double[] coordenadas = listaDados.toArray(new Double[listaDados.size()]);
		return converteDados(coordenadas);
	}

	public Integer obtemClasse(int i) {

		return respostas.get(i);
	}

	public int quantidadeDados() {

		return dados.size();
	}

	public double[] converteDados(Double[] coordenadas) {

		double[] dadosConvertidos = new double[coordenadas.length];

		for (int i = 0; i < dadosConvertidos.length; i++) {

			dadosConvertidos[i] = coordenadas[i];
		}

		return dadosConvertidos;
	}
}
